/*
 * nipc.h
 *
 *  Created on: 15/09/2011
 *      Author: utn_so
 */

#ifndef NIPC_H_
#define NIPC_H_

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

#define BIND_ERROR 67
#define HANDSHAKE_FAIL 40
#define HANDSHAKE_OK 41

#define nipc_initmsg {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 0,0,NULL}

enum MPS_ERRORS
{
        NIPC_ERROR = -1,
        NIPC_CONNECTION_LOST = 0,
        NIPC_ERROR_NONE = 1,
};

typedef enum
{
			READ = 1,
			WRITE,
} tipo;
//preguntar si el TYPE del nipc se refiere a leer/escribir

typedef struct {
		char			payloadID[16]; // 16 + 1 = 17
        unsigned char	type; // 1
        short int		payloadLength; // 2
        char			*payload; //

} nipcMessage ;


/* en el payload

para plani: handshake = "IdDelPlani;"

(envio desde RAID a Plani)
no handshake, pedido de lectura = "IdDelPlani;NumeroSector;"
no handshake, pedido de escritura = "IdDelPlani;NumeroSector;Buffer"

(envio desde Plani a RAID)
no handshake, respuesta de lectura = "IdDelPlani;NumeroSector;Buffer"
no handshake, respuesta de escritura = "IdDelPlani;NumeroSector;"


para fs: handshake = vacio

(envio desde RAID a FS)
no handshake, respuesta de lectura = "NumeroSector;Buffer"
no handshake, respuesta de escritura = "NumeroSector;"

(envio desde FS a RAID)
no handshake, pedido de lectura = "NumeroSector;"
no handshake, pedido de escritura = "NumeroSector;Buffer"

*/

void nipc_make(nipcMessage *nipc, int pDescriptor, unsigned char type, short int plength, char *payload);

void nipc_0payload(nipcMessage *nipc,  int pDescriptor);

void nipc_freepayload(nipcMessage *nipc);

int nipc_recv(nipcMessage *nipc, int pDescriptor);

int nipc_send(nipcMessage *nipc, int pDescriptor);

int sockets_open_server(char *ip, unsigned short port, int slots);

int sockets_open_client(char *ip, unsigned short port);

#endif /* NIPC_H_ */
